/*
 * This file is part of Annuaire.
 *
 * Annuaire is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Foobar is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with Annuaire.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.miage.annuaire;

import static org.junit.Assert.*;

import org.miage.annuaire.Membre;
import org.miage.annuaire.Structure;

/**
 * Classe proposant des méthodes utilitaires pour les tests.
 * @author guhumber
 */
public class Util {

	/**
	 * Classe utilitaire.
	 */
	private Util() {
		// Rien.
	}

	/**
	 * Vérifie les caractéristiques d'une structure par rapport à son père et
	 * ses filles.
	 * @param structure La structure à vérifier.
	 * @param level Le niveau attendu de la structure.
	 * @param father Le père attendu de la structure.
	 * @param children Les filles attendues de la structure.
	 */
	public static void checkStructureChild(Structure structure, int level,
			Structure father, Structure[] children) {
		
		assertEquals(children.length, structure.getChilds().size());
		assertEquals(level, structure.getLevel());
		assertEquals(father, structure.getFather());
		for (Structure child : children) {
			assertTrue(structure.getChilds().contains(child));
			assertEquals(structure, child.getFather());
			assertEquals(structure.getLevel() + 1, child.getLevel());
		}
	}

	/**
	 * Vérifie qu'une structure possède un certain nombre de membres. Chaque
	 * membre doit aussi être rattaché à cette structure. Les vérifications sur
	 * la bidirectionnalité se font aussi sur le leader, le contact et les
	 * assistants leader.
	 * @param structure La structure à tester.
	 * @param membres Les membres qui appartiennent à la structure.
	 * @param leader Le leader de la structure.
	 * @param contact Le contact de la structure.
	 * @param assistantsLeader Les assistants leader de la structure.
	 */
	public static void checkStructureMembre(Structure structure,
			Membre[] membres, Membre leader, Membre contact,
			Membre[] assistantsLeader) {
		
		assertEquals(membres.length, structure.getMembres().size());
		
		for (Membre membre : membres) {
			assertTrue(structure.getMembres().contains(membre));
			assertEquals(structure, membre.getStructure());
		}
	
		assertEquals(leader, structure.getLeader());
		
		if (leader != null) {
			assertTrue(leader.isLeader());
		}
		
		assertEquals(contact, structure.getContact());
		
		if (contact != null) {
			assertTrue(contact.isContact());
		}
		
		for (Membre assistant : assistantsLeader) {
			assertTrue(structure.getAssistantLeaders().contains(assistant));
			assertTrue(assistant.isAssistantLeader());
		}
	}

	/**
	 * Vérifie les attributs d'un membre.
	 * @param membre Le membre à vérifier.
	 * @param structure La structure à laquelle appartient ce membre.
	 * @param leader Le membre est-il leader d'une structure?
	 * @param contact Le membre est-il contact d'une structure?
	 * @param assistantLeader Le membre est-il assistant leader d'une structure?
	 */
	public static void checkMembre(Membre membre, Structure structure,
			boolean leader, boolean contact, boolean assistantLeader) {
		
		assertEquals(structure, membre.getStructure());
		assertTrue(leader == membre.isLeader());
		assertTrue(contact == membre.isContact());
		assertTrue(assistantLeader == membre.isAssistantLeader());
	}

}
